Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+โ†‘Ctrl+โ†“to navigate, Ctrl+๐Ÿ–ฑ๏ธto focus. On Mac, use Cmdinstead of Ctrl.
import SSA.Core.WellTypedFramework
import SSA.Core.Tactic
import SSA.Projects.InstCombine.InstCombineBase
import SSA.Projects.InstCombine.InstCombineAliveStatements

open SSA InstCombine

-- Name:AddSub:1043
-- precondition: true
/-
  %Y = and %Z, C1
  %X = xor %Y, C1
  %LHS = add %X, 1
  %r = add %LHS, %RHS

=>
  %or = or %Z, ~C1
  %Y = and %Z, C1
  %X = xor %Y, C1
  %LHS = add %X, 1
  %r = sub %RHS, %or

-/
open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `Z` [linter.unusedVariables]
Warning: unused variable `C1` [linter.unusedVariables]
Warning: unused variable `RHS` [linter.unusedVariables]
Z C1
RHS: โ„•
RHS
:
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.4076
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Z)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v4 %v2; %v6 := op:xor w %v5; %v7 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
1: ?m.5093
1
)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:add w %v8; %v10 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
RHS: โ„•
RHS
)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:add w %v11 dsl_ret %v12 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.4076
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Z)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C1)) %v9999; %v3 := op:not w %v2; %v4 := pair:%v1 %v3; %v5 := op:or w %v4; %v6 := pair:%v1 %v2; %v7 := op:and w %v6; %v8 := pair:%v7 %v2; %v9 := op:xor w %v8; %v10 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
1: ?m.8921
1
)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:add w %v11; %v13 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
RHS: โ„•
RHS
)) %v9999; %v14 := pair:%v13 %v5; %v15 := op:sub w %v14 dsl_ret %v15 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
Warning: unused variable `Z` [linter.unusedVariables]
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
Warning: unused variable `C` [linter.unusedVariables]
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
Warning: unused variable `RHS` [linter.unusedVariables]
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

w, Z, C, RHS, Z', C1, RHS': โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z')) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z')) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

w, Z, C, RHS, Z', C1, RHS': โ„•


(Option.bind (Bitvec.add? (Bitvec.xor (Bitvec.and (Bitvec.ofInt' w โ†‘Z') (Bitvec.ofInt' w โ†‘C1)) (Bitvec.ofInt' w โ†‘C1)) (Bitvec.ofInt' w 1)) fun fst => Bitvec.add? fst (Bitvec.ofInt' w โ†‘RHS')) โŠ‘ some (Bitvec.sub (Bitvec.ofInt' w โ†‘RHS') (Bitvec.or (Bitvec.ofInt' w โ†‘Z') (Bitvec.not (Bitvec.ofInt' w โ†‘C1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (Z C1 RHS : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘RHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Z)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1152 -- precondition: true /- %r = add i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `x` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
x y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.75322
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:add w %v3 dsl_ret %v4 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.75322
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3 dsl_ret %v4 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


Bitvec.add? (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1164 -- precondition: true /- %na = sub 0, %a %c = add %na, %b => %na = sub 0, %a %c = sub %b, %a -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.98433
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.100049
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:add w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.98433
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.102335
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘aโœ)) (Bitvec.ofInt' wโœ โ†‘bโœ) โŠ‘ some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘bโœ) (Bitvec.ofInt' wโœ โ†‘aโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1165 -- precondition: true /- %na = sub 0, %a %nb = sub 0, %b %c = add %na, %nb => %ab = add %a, %b %na = sub 0, %a %nb = sub 0, %b %c = sub 0, %ab -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.132195
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.134829
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.133198
0
)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:sub w %v7; %v9 := pair:%v4 %v8; %v10 := op:add w %v9 dsl_ret %v10 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.132195
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:add w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.137138
0
)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:sub w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.136635
0
)) %v9999; %v9 := pair:%v8 %v2; %v10 := op:sub w %v9; %v11 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.136090
0
)) %v9999; %v12 := pair:%v11 %v4; %v13 := op:sub w %v12 dsl_ret %v13 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘aโœ)) (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ Option.bind (Bitvec.add? (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโœ 0) snd)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1176 -- precondition: true /- %nb = sub 0, %b %c = add %a, %nb => %nb = sub 0, %b %c = sub %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (b a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `b` [linter.unusedVariables]
Warning: unused variable `a` [linter.unusedVariables]
b a :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.188510
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.190126
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:add w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.188510
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.192412
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (b a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, bโœยน, aโœยน, bโœ, aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (b a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, bโœยน, aโœยน, bโœ, aโœ: โ„•


Bitvec.add? (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (b a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1295 -- precondition: true /- %aab = and %a, %b %aob = xor %a, %b %c = add %aab, %aob => %aab = and %a, %b %aob = xor %a, %b %c = or %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.221990
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v4 %v6; %v8 := op:add w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.221990
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v1 %v2; %v8 := op:or w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1309 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.266996
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v4 %v6; %v8 := op:add w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.266996
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v1 %v2; %v8 := op:add w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ Bitvec.add? (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1309-2 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.310329
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v4 %v6; %v8 := op:add w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.310329
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v1 %v2; %v8 := op:add w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ Bitvec.add? (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1309-3 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.353662
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v4 %v6; %v8 := op:add w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.353662
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v1 %v2; %v8 := op:add w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


Bitvec.add? (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) โŠ‘ Bitvec.add? (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1539 -- precondition: true /- %na = sub 0, %a %r = sub %x, %na => %na = sub 0, %a %r = add %x, %a -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `x` [linter.unusedVariables]
a x :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.397244
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.398860
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:sub w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.397244
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.401146
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:add w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, xโœยน, aโœ, xโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, xโœยน, aโœ, xโœ: โ„•


some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘aโœ))) โŠ‘ Bitvec.add? (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘aโœ)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1546 -- precondition: true /- %na = sub nsw 0, %a %r = sub nsw %x, %na => %na = sub nsw 0, %a %r = add nsw %x, %a -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `x` [linter.unusedVariables]
a x :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.431147
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.432763
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:sub w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.431147
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.435049
0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:add w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, xโœยน, aโœ, xโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, xโœยน, aโœ, xโœ: โ„•


some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘aโœ))) โŠ‘ Bitvec.add? (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘aโœ)
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a x : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1556 -- precondition: true /- %r = sub i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `x` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
x y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.464037
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3 dsl_ret %v4 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.464037
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3 dsl_ret %v4 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ)) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1560 -- precondition: true /- %r = sub -1, %a => %r = xor %a, -1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โˆ€ (a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (a a :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.488077
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.488671
1
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3 dsl_ret %v4 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.488077
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.490162
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3 dsl_ret %v4 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โˆ€ (a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โˆ€ (a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, aโœ: โ„•


some (Bitvec.sub (Bitvec.ofInt' wโœ (-1)) (Bitvec.ofInt' wโœ โ†‘aโœ)) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1)))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โˆ€ (a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1614 -- precondition: true /- %Op1 = add %X, %Y %r = sub %X, %Op1 => %Op1 = add %X, %Y %r = sub 0, %Y -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `X` [linter.unusedVariables]
Warning: unused variable `Y` [linter.unusedVariables]
X Y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.515544
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (X)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:add w %v3; %v5 := pair:%v1 %v4; %v6 := op:sub w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.515544
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (X)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:add w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.517748
0
)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Xโœยน, Yโœยน, Xโœ, Yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Xโœยน, Yโœยน, Xโœ, Yโœ: โ„•


(Option.bind (Bitvec.add? (Bitvec.ofInt' wโœ โ†‘Xโœ) (Bitvec.ofInt' wโœ โ†‘Yโœ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘Xโœ) snd)) โŠ‘ some (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘Yโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1619 -- precondition: true /- %Op0 = sub %X, %Y %r = sub %Op0, %X => %Op0 = sub %X, %Y %r = sub 0, %Y -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `X` [linter.unusedVariables]
Warning: unused variable `Y` [linter.unusedVariables]
X Y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.550246
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (X)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := pair:%v4 %v1; %v6 := op:sub w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.550246
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (X)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (Y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:sub w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
0: ?m.552450
0
)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub w %v6 dsl_ret %v7 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Xโœยน, Yโœยน, Xโœ, Yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Xโœยน, Yโœยน, Xโœ, Yโœ: โ„•


some (Bitvec.sub (Bitvec.sub (Bitvec.ofInt' wโœ โ†‘Xโœ) (Bitvec.ofInt' wโœ โ†‘Yโœ)) (Bitvec.ofInt' wโœ โ†‘Xโœ)) โŠ‘ some (Bitvec.sub (Bitvec.ofInt' wโœ 0) (Bitvec.ofInt' wโœ โ†‘Yโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (X Y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘Y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘X)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AddSub:1624 -- precondition: true /- %Op0 = or %A, %B %Op1 = xor %A, %B %r = sub %Op0, %Op1 => %Op0 = or %A, %B %Op1 = xor %A, %B %r = and %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.585383
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v4 %v6; %v8 := op:sub w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.585383
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v1 %v2; %v8 := op:and w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.sub (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1230 ~A & ~B -> ~(A | B) -- precondition: true /- %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %or = or %notOp0, %notOp1 %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = xor %or, -1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (notOp0 notOp1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `notOp0` [linter.unusedVariables]
Warning: unused variable `notOp1` [linter.unusedVariables]
notOp0: โ„•
notOp0
notOp1: โ„•
notOp1
:
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.632975
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
notOp0: โ„•
notOp0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.635272
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
notOp1: โ„•
notOp1
)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.633732
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v4 %v8; %v10 := op:and w %v9 dsl_ret %v10 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.632975
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
notOp0: โ„•
notOp0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
notOp1: โ„•
notOp1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.637754
1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.637229
1
)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor w %v9; %v11 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.636661
1
)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor w %v12 dsl_ret %v13 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (notOp0 notOp1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, notOp0โœยน, notOp1โœยน, notOp0โœ, notOp1โœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘notOp1โœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘notOp0โœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘notOp1โœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘notOp0โœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (notOp0 notOp1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, notOp0โœยน, notOp1โœยน, notOp0โœ, notOp1โœ: โ„•


some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘notOp0โœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘notOp1โœ) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโœ โ†‘notOp0โœ) (Bitvec.ofInt' wโœ โ†‘notOp1โœ)) (Bitvec.ofInt' wโœ (-1)))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (notOp0 notOp1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘notOp0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1241 (A|B) & ~(A&B) => A^B -- precondition: true /- %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = xor %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.693660
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := pair:%v1 %v2; %v6 := op:and w %v5; %v7 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.694425
1
)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor w %v8; %v10 := pair:%v4 %v9; %v11 := op:and w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.693660
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := pair:%v1 %v2; %v6 := op:and w %v5; %v7 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.698211
1
)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor w %v8; %v10 := pair:%v1 %v2; %v11 := op:xor w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1247 ~(A&B) & (A|B) => A^B -- precondition: true /- %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = and %op0, %op1 => %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = xor %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.763061
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.764229
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v2; %v9 := op:or w %v8; %v10 := pair:%v7 %v9; %v11 := op:and w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.763061
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.767944
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v2; %v9 := op:or w %v8; %v10 := pair:%v1 %v2; %v11 := op:xor w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.and (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ (-1))) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1253 A & (A^B) -> A & ~B -- precondition: true /- %op0 = xor %A, %B %r = and %op0, %A => %notB = xor %B, -1 %op0 = xor %A, %B %r = and %A, %notB -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B B A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.829751
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := pair:%v4 %v1; %v6 := op:and w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.829751
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.832812
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xor w %v6; %v8 := pair:%v5 %v4; %v9 := op:and w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ)) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1280 (~A|B)&A -> A&B -- precondition: true /- %nA = xor %A, -1 %op0 = or %nA, %B %r = and %op0, %A => %nA = xor %A, -1 %op0 = or %nA, %B %r = and %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.878045
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.879406
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:or w %v6; %v8 := pair:%v7 %v1; %v9 := op:and w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.878045
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.882421
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:or w %v6; %v8 := pair:%v1 %v5; %v9 := op:and w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.and (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ)) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1288 (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %op1 => %op0 = xor %A, %B %negC = xor %C, -1 %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %negC -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B C A B C :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.933218
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v1; %v9 := op:xor w %v8; %v10 := pair:%v4 %v9; %v11 := op:and w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.933218
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.938015
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v2 %v5; %v10 := op:xor w %v9; %v11 := pair:%v10 %v1; %v12 := op:xor w %v11; %v13 := pair:%v4 %v8; %v14 := op:and w %v13 dsl_ret %v14 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Cโœยน, Aโœ, Bโœ, Cโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Cโœยน, Aโœ, Bโœ, Cโœ: โ„•


some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ))) โŠ‘ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Cโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:1294 (A | B) & ((~A) ^ B) -> (A & B) -- precondition: true /- %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %op0, %op1 => %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1022043
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1023210
1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v2; %v9 := op:xor w %v8; %v10 := pair:%v4 %v9; %v11 := op:and w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1022043
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1026998
1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v2; %v9 := op:xor w %v8; %v10 := pair:%v1 %v2; %v11 := op:and w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2113 ((~A & B) | A) -> (A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %negA, %B %r = or %op0, %A => %negA = xor %A, -1 %op0 = and %negA, %B %r = or %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1091030
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1092391
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:and w %v6; %v8 := pair:%v7 %v1; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1091030
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1095406
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:and w %v6; %v8 := pair:%v1 %v5; %v9 := op:or w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ)) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2118 ((A & B) | ~A) -> (~A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %A, %B %r = or %op0, %negA => %negA = xor %A, -1 %op0 = and %A, %B %r = or %negA, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1146107
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1147468
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:and w %v6; %v8 := pair:%v7 %v4; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1146107
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1150483
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:and w %v6; %v8 := pair:%v4 %v5; %v9 := op:or w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2123 (A & (~B)) | (A ^ B) -> (A ^ B) -- precondition: true /- %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = or %op0, %op1 => %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = xor %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (B A B A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1204343
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1206076
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:and w %v6; %v8 := pair:%v5 %v1; %v9 := op:xor w %v8; %v10 := pair:%v7 %v9; %v11 := op:or w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1204343
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1209431
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:and w %v6; %v8 := pair:%v5 %v1; %v9 := op:xor w %v8; %v10 := pair:%v5 %v1; %v11 := op:xor w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Bโœยน, Aโœยน, Bโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Bโœยน, Aโœยน, Bโœ, Aโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2188 -- precondition: true /- %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = or %op0, %op1 => %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = xor %A, %D -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (D A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `D` [linter.unusedVariables]
Warning: unused variable `A` [linter.unusedVariables]
D A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1270568
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (D)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1273663
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1272129
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v5 %v4; %v10 := op:and w %v9; %v11 := pair:%v8 %v1; %v12 := op:and w %v11; %v13 := pair:%v10 %v12; %v14 := op:or w %v13 dsl_ret %v14 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1270568
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (D)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1277615
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1276107
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v5 %v4; %v10 := op:and w %v9; %v11 := pair:%v8 %v1; %v12 := op:and w %v11; %v13 := pair:%v5 %v1; %v14 := op:xor w %v13 dsl_ret %v14 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (D A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Dโœยน, Aโœยน, Dโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Dโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Dโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (D A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Dโœยน, Aโœยน, Dโœ, Aโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Dโœ) (Bitvec.ofInt' wโœ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Dโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Dโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (D A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘D)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2231 (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %op1 => %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %C -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
Warning: unused variable `C` [linter.unusedVariables]
A B C :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1353968
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v1; %v9 := op:xor w %v8; %v10 := pair:%v4 %v9; %v11 := op:or w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1353968
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v1; %v9 := op:xor w %v8; %v10 := pair:%v4 %v5; %v11 := op:or w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Cโœยน, Aโœ, Bโœ, Cโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Cโœยน, Aโœ, Bโœ, Cโœ: โ„•


some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ))) โŠ‘ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ โ†‘Cโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A B C : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2243 ((B | C) & A) | B -> B | (A & C) -- precondition: true /- %o = or %B, %C %op0 = and %o, %A %r = or %op0, %B => %a = and %A, %C %o = or %B, %C %op0 = and %o, %A %r = or %B, %a -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A C B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `B` [linter.unusedVariables]
Warning: unused variable `C` [linter.unusedVariables]
Warning: unused variable `A` [linter.unusedVariables]
A C B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1425022
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:and w %v6; %v8 := pair:%v7 %v1; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1425022
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:or w %v6; %v8 := pair:%v7 %v1; %v9 := op:and w %v8; %v10 := pair:%v5 %v4; %v11 := op:or w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A C B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Bโœยน, Cโœยน, Aโœยน, Aโœ, Cโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A C B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Bโœยน, Cโœยน, Aโœยน, Aโœ, Cโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ โ†‘Cโœ)) (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Bitvec.ofInt' wโœ โ†‘Bโœ)) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Cโœ)))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A C B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2247 (~A | ~B) == (~(A & B)) -- precondition: true /- %na = xor %A, -1 %nb = xor %B, -1 %r = or %na, %nb => %a = and %A, %B %na = xor %A, -1 %nb = xor %B, -1 %r = xor %a, -1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1486040
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1488337
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1486797
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v4 %v8; %v10 := op:or w %v9 dsl_ret %v10 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1486040
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1490819
1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1490294
1
)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor w %v9; %v11 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1489726
1
)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor w %v12 dsl_ret %v13 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ (-1)))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2263 -- precondition: true /- %op1 = xor %op0, %B %r = or %op0, %op1 => %op1 = xor %op0, %B %r = or %op0, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op0 B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `op0` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
op0: โ„•
op0
B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1544691
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op0: โ„•
op0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := pair:%v1 %v4; %v6 := op:or w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1544691
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op0: โ„•
op0
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5 dsl_ret %v6 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op0 B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, op0โœยน, Bโœยน, op0โœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op0โœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op0โœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op0 B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, op0โœยน, Bโœยน, op0โœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘op0โœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘op0โœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘op0โœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op0 B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op0)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2264 -- precondition: true /- %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %op1 => %nb = xor %B, -1 %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %nb -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
B A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1579985
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1581346
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v7; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1579985
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1585744
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1584230
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v8 %v1; %v10 := op:xor w %v9; %v11 := pair:%v5 %v4; %v12 := op:or w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2265 -- precondition: true /- %op0 = and %A, %B %op1 = xor %A, %B %r = or %op0, %op1 => %op0 = and %A, %B %op1 = xor %A, %B %r = or %A, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1641426
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v4 %v6; %v8 := op:or w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1641426
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v1 %v2; %v8 := op:or w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2284 -- precondition: true /- %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
B A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1689135
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1689908
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v7; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1689135
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1695173
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:or w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1693274
1
)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor w %v9; %v11 := pair:%v5 %v4; %v12 := op:or w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2285 -- precondition: true /- %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `B` [linter.unusedVariables]
B A :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1752119
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1752892
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v7; %v9 := op:or w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1752119
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1758157
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xor w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1756258
1
)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor w %v9; %v11 := pair:%v5 %v4; %v12 := op:or w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Bโœ, Aโœ: โ„•


some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Bโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (B A : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2297 -- precondition: true /- %op0 = and %A, %B %na = xor %A, -1 %op1 = xor %na, %B %r = or %op0, %op1 => %na = xor %A, -1 %op0 = and %A, %B %op1 = xor %na, %B %r = xor %na, %B -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (A B A B :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1815503
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1816670
1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor w %v6; %v8 := pair:%v7 %v2; %v9 := op:xor w %v8; %v10 := pair:%v4 %v9; %v11 := op:or w %v10 dsl_ret %v11 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1815503
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1820877
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (B)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:and w %v6; %v8 := pair:%v4 %v5; %v9 := op:xor w %v8; %v10 := pair:%v4 %v5; %v11 := op:xor w %v10 dsl_ret %v11 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, Bโœยน, Aโœ, Bโœ: โ„•


some (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘Bโœ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘Bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (A B : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘B)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2367 -- precondition: true /- %op0 = or %A, C1 %r = or %op0, %op1 => %i = or %A, %op1 %op0 = or %A, C1 %r = or %i, C1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A op1 C1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `A` [linter.unusedVariables]
Warning: unused variable `C1` [linter.unusedVariables]
Warning: unused variable `op1` [linter.unusedVariables]
A
op1: โ„•
op1
C1 :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1885742
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:or w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1885742
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (A)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (C1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:or w %v6; %v8 := pair:%v4 %v5; %v9 := op:or w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A op1 C1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, C1โœยน, op1โœยน, Aโœ, op1โœ, C1โœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘C1โœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘C1โœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘Aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A op1 C1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, Aโœยน, C1โœยน, op1โœยน, Aโœ, op1โœ, C1โœ: โ„•


some (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘C1โœ)) (Bitvec.ofInt' wโœ โ†‘op1โœ)) โŠ‘ some (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโœ โ†‘Aโœ) (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Bitvec.ofInt' wโœ โ†‘C1โœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (A op1 C1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘C1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘A)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2416 -- precondition: true /- %x = xor %nx, -1 %op0 = and %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `nx` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
y nx :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1931725
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (nx)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1934016
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:and w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1932106
1
)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor w %v9 dsl_ret %v10 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1931725
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1937588
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (nx)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1936080
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v8 %v1; %v10 := op:and w %v9; %v11 := pair:%v5 %v4; %v12 := op:or w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, nxโœยน, yโœยน, yโœ, nxโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘nxโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘nxโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, nxโœยน, yโœยน, yโœ, nxโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘nxโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘yโœ)) (Bitvec.ofInt' wโœ (-1))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘nxโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘yโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2417 -- precondition: true /- %x = xor %nx, -1 %op0 = or %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `nx` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
y nx :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1994430
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (nx)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1996721
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:or w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1994811
1
)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor w %v9 dsl_ret %v10 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.1994430
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2000293
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (nx)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.1998785
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v8 %v1; %v10 := op:or w %v9; %v11 := pair:%v5 %v4; %v12 := op:and w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, nxโœยน, yโœยน, yโœ, nxโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘nxโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘nxโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, nxโœยน, yโœยน, yโœ, nxโœ: โ„•


some (Bitvec.xor (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘nxโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘yโœ)) (Bitvec.ofInt' wโœ (-1))) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘nxโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘yโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (y nx : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘nx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2429 -- precondition: true /- %op0 = and %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `x` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
x y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2056877
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2057258
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2056877
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2062535
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2061023
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v5; %v10 := op:and w %v9; %v11 := pair:%v4 %v8; %v12 := op:or w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ)) (Bitvec.ofInt' wโœ (-1))) โŠ‘ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘yโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2430 -- precondition: true /- %op0 = or %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `x` [linter.unusedVariables]
Warning: unused variable `y` [linter.unusedVariables]
x y :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2116571
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2116952
1
)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor w %v6 dsl_ret %v7 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2116571
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (x)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2122229
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (y)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2120717
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v5; %v10 := op:or w %v9; %v11 := pair:%v4 %v8; %v12 := op:and w %v11 dsl_ret %v12 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘yโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘xโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, xโœยน, yโœยน, xโœ, yโœ: โ„•


some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ โ†‘yโœ)) (Bitvec.ofInt' wโœ (-1))) โŠ‘ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘xโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘yโœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (x y : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘y)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘x)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2581 (B|A)^B -> A & ~B -- precondition: true /- %op0 = or %a, %op1 %r = xor %op0, %op1 => %nop1 = xor %op1, -1 %op0 = or %a, %op1 %r = and %a, %nop1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op1 a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (a
op1: โ„•
op1
op1: โ„•
op1
a :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2175019
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:or w %v3; %v5 := pair:%v4 %v2; %v6 := op:xor w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2175019
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2178072
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:or w %v6; %v8 := pair:%v5 %v4; %v9 := op:and w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op1 a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, op1โœยน, op1โœ, aโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op1 a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, op1โœยน, op1โœ, aโœ: โ„•


some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Bitvec.ofInt' wโœ โ†‘op1โœ)) โŠ‘ some (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘op1โœ) (Bitvec.ofInt' wโœ (-1))))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (op1 a : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2587 (B&A)^A -> ~B & A -- precondition: true /- %op0 = and %a, %op1 %r = xor %op0, %op1 => %na = xor %a, -1 %op0 = and %a, %op1 %r = and %na, %op1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a op1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (a
op1: โ„•
op1
a
op1: โ„•
op1
:
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2221876
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v4 %v2; %v6 := op:xor w %v5 dsl_ret %v6 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2221876
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2224929
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (
op1: โ„•
op1
)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:and w %v6; %v8 := pair:%v4 %v5; %v9 := op:and w %v8 dsl_ret %v9 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a op1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, op1โœยน, aโœ, op1โœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a op1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, op1โœยน, aโœ, op1โœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘op1โœ)) (Bitvec.ofInt' wโœ โ†‘op1โœ)) โŠ‘ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘op1โœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a op1 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘op1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2595 -- precondition: true /- %op0 = and %a, %b %op1 = or %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = or %a, %b %r = xor %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2269443
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v4 %v6; %v8 := op:xor w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2269443
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:or w %v5; %v7 := pair:%v1 %v2; %v8 := op:xor w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2607 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2317841
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2320938
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2319404
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v8; %v10 := op:or w %v9; %v11 := pair:%v4 %v5; %v12 := op:or w %v11; %v13 := pair:%v10 %v12; %v14 := op:xor w %v13 dsl_ret %v14 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2317841
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2324892
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2323384
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v8; %v10 := op:or w %v9; %v11 := pair:%v4 %v5; %v12 := op:or w %v11; %v13 := pair:%v1 %v5; %v14 := op:xor w %v13 dsl_ret %v14 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘bโœ) (Bitvec.ofInt' wโœ (-1)))) (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2617 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2402087
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2405184
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2403650
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v8; %v10 := op:and w %v9; %v11 := pair:%v4 %v5; %v12 := op:and w %v11; %v13 := pair:%v10 %v12; %v14 := op:xor w %v13 dsl_ret %v14 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2402087
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2409138
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2407630
1
)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor w %v7; %v9 := pair:%v1 %v8; %v10 := op:and w %v9; %v11 := pair:%v4 %v5; %v12 := op:and w %v11; %v13 := pair:%v1 %v5; %v14 := op:xor w %v13 dsl_ret %v14 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘bโœ) (Bitvec.ofInt' wโœ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2627 -- precondition: true /- %op0 = xor %a, %c %op1 = or %a, %b %r = xor %op0, %op1 => %na = xor %a, -1 %and = and %na, %b %op0 = xor %a, %c %op1 = or %a, %b %r = xor %and, %c -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (a b c_2 : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c_2)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c_2)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (a c b a b c :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2485067
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (c)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:or w %v6; %v8 := pair:%v4 %v7; %v9 := op:xor w %v8 dsl_ret %v9 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2485067
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2490584
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:and w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (c)) %v9999; %v9 := pair:%v1 %v8; %v10 := op:xor w %v9; %v11 := pair:%v1 %v5; %v12 := op:or w %v11; %v13 := pair:%v7 %v8; %v14 := op:xor w %v13 dsl_ret %v14 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (a b c : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœยฒ: Context BaseType

e: EnvC cโœยฒ

wโœ, aโœยน, cโœยน, bโœยน, aโœ, bโœ, cโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘cโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘cโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (a b c : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœยฒ: Context BaseType

e: EnvC cโœยฒ

wโœ, aโœยน, cโœยน, bโœยน, aโœ, bโœ, cโœ: โ„•


some (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘cโœ)) (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))) โŠ‘ some (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1))) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.ofInt' wโœ โ†‘cโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โ„• โ†’ โˆ€ (a b c : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘c)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2647 -- precondition: true /- %op0 = and %a, %b %op1 = xor %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = xor %a, %b %r = or %a, %b -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `a` [linter.unusedVariables]
Warning: unused variable `b` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2559063
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v4 %v6; %v8 := op:xor w %v7 dsl_ret %v8 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2559063
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := pair:%v1 %v2; %v6 := op:xor w %v5; %v7 := pair:%v1 %v2; %v8 := op:or w %v7 dsl_ret %v8 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, aโœยน, bโœยน, aโœ, bโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))) โŠ‘ some (Bitvec.or (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™
-- Name:AndOrXor:2658 -- precondition: true /- %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %op0, %na => %and = and %a, %b %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %and, -1 -/ open SSA EDSL in
example: โˆ€ {c : Context BaseType} {e : EnvC c} (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
example
: forall (w :
Nat: Type
Nat
) (
Warning: unused variable `b` [linter.unusedVariables]
Warning: unused variable `a` [linter.unusedVariables]
a b :
Nat: Type
Nat
),
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2607019
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2609689
1
)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:and w %v6; %v8 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2607784
1
)) %v9999; %v9 := pair:%v5 %v8; %v10 := op:xor w %v9; %v11 := pair:%v7 %v10; %v12 := op:xor w %v11 dsl_ret %v12 ] โŠ‘
TSSA.eval: {Op ฮฒ : Type} โ†’ [inst : Goedel ฮฒ] โ†’ [TUS : TypedUserSemantics Op ฮฒ] โ†’ {ฮ“ : Context ฮฒ} โ†’ {i : TSSAIndex ฮฒ} โ†’ TSSA Op ฮ“ i โ†’ EnvC ฮ“ โ†’ TSSAIndex.eval i
TSSA.eval
(Op :=
Op: Type
Op
) (e :=
e: ?m.2607019
e
) (i :=
TSSAIndex.TERMINATOR: {ฮฒ : Type} โ†’ SSA.UserType ฮฒ โ†’ TSSAIndex ฮฒ
TSSAIndex.TERMINATOR
(
UserType.base: {ฮฒ : Type} โ†’ ฮฒ โ†’ SSA.UserType ฮฒ
UserType.base
(
BaseType.bitvec: โ„• โ†’ BaseType
BaseType.bitvec
w))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (a)) %v9999; %v2 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (b)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:and w %v3; %v5 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2612621
1
)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor w %v6; %v8 := pair:%v1 %v7; %v9 := op:and w %v8; %v10 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2611703
1
)) %v9999; %v11 := pair:%v1 %v10; %v12 := op:xor w %v11; %v13 := op:const (
Bitvec.ofInt': (n : โ„•) โ†’ โ„ค โ†’ Bitvec n
Bitvec.ofInt'
w (-
1: ?m.2611100
1
)) %v9999; %v14 := pair:%v4 %v13; %v15 := op:xor w %v14 dsl_ret %v15 ] :=

Goals accomplished! ๐Ÿ™
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, bโœยน, aโœยน, aโœ, bโœ: โ„•


TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโœ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโœ) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘bโœ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโœ โ†‘aโœ)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e
cโœ: Context BaseType

e: EnvC cโœ

wโœ, bโœยน, aโœยน, aโœ, bโœ: โ„•


some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘bโœ) (Bitvec.ofInt' wโœ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ (-1)))) โŠ‘ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโœ โ†‘aโœ) (Bitvec.ofInt' wโœ โ†‘bโœ)) (Bitvec.ofInt' wโœ (-1)))
cโœ: Context BaseType

e: EnvC cโœ


โˆ€ (w : โ„•), โ„• โ†’ โ„• โ†’ โˆ€ (a b : โ„•), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e โŠ‘ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โˆ˜ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘b)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โ†‘a)) Context.Var.last TSSA.rgn0)) โˆ˜ (fun prev => TSSA.assign prev 9999 TSSA.unit) โˆ˜ id) TSSA.nop) Context.Var.last) e

Goals accomplished! ๐Ÿ™